#include <REGX52.H>
#include "Delay.h"        // 包含Delay头文件
#include "LCD1602.h"      // 包含LCD1602头文件
#include "MatrixKey.h"    // 包含矩阵键盘头文件

unsigned char KeyNum;
unsigned int pwm_duty_cycle = 0;  // 占空比初始值，pwm范围0-100
unsigned int last_pwm_duty_cycle = 0xFF;  // 用于存储上一次的PWM占空比
int i=5;

void PWM_Init() {
    TMOD &= 0xF0;  // 清除定时器0的控制位
    TMOD |= 0x02;  // 设置定时器0为模式2
    TH0 = 0xF0;    // 设置定时器初值，调整这里控制PWM频率
    TL0 = 0xF0;    // 设置定时器重装值
    ET0 = 1;       // 开启定时器0中断
    EA = 1;        // 开启全局中断
    TR0 = 1;       // 启动定时器0
    P2 = P2 & 0xFE; // 确保P2.0初始为低电平
}

void Timer0_ISR(void) interrupt 1 using 1 {
    static unsigned int pwm_count = 0;
    pwm_count++;
    if (pwm_count >= 100) pwm_count = 0; // 重置计数器

    if (pwm_count < pwm_duty_cycle) {
        P2 |= 0x01; // P2.0设置为高电平
    } else {
        P2 &= 0xFE; // P2.0设置为低电平
    }
}

void main() {
    PWM_Init();
    LCD_Init();
    LCD_ShowString(1,1,"PWM Duty:");
    while (1) {
        KeyNum = MatrixKey();
        if (KeyNum != 0) {  
            Delay(10);  // 消抖
            if (KeyNum != 0) {  // 再次检测确保按钮被按下
                switch (KeyNum) {
                    case 1: pwm_duty_cycle = 0; break;
                    case 2: pwm_duty_cycle += i; break;
                    case 3: if (pwm_duty_cycle >= i) {
   								 pwm_duty_cycle -= i; 
								} else {
								    pwm_duty_cycle = 0; // 确保不小于0
							}; break;
                    case 4: pwm_duty_cycle = 100; break;
                    // 自增减速率；
                    case 13: i = 1; break;  // S13
                    case 14: i = 3; break;  // S14
                    case 15: i = 5; break;  // S15
                    case 16: i = 10; break; // S16
                }
                pwm_duty_cycle = pwm_duty_cycle > 100 ? 100 : pwm_duty_cycle; // 限制最大值为100 
								if (pwm_duty_cycle != last_pwm_duty_cycle) {
                    LCD_ShowNum(2,1,pwm_duty_cycle,3);  // 只有在变化时更新显示
                    last_pwm_duty_cycle = pwm_duty_cycle;
                }
                //Delay(50);  // 增加延时以稳定LCD显示
            }
        }
    }
}
